// 引入其他的类
import Snake from "./Snake";
import Food from "./Food";
import ScorePanel from "./ScorePanel";


// 游戏控制器，控制其他所有类
class GameControl {
   // 定义三个属性
   // 蛇
   snake: Snake
   // 食物
   food: Food
   // 记分牌
   scorePanel: ScorePanel
   // 创建一个属性来存储蛇的移动方向(也就是按键方向)
   direction: string = ''
   // 创建一个属性用来记录游戏是否结束
   isLive = true

   constructor() {
      this.snake = new Snake()
      this.food = new Food()
      this.scorePanel = new ScorePanel(10, 4)

      this.init()
   }

   // 游戏的初始化方法，调用后游戏开始
   init() {
      // 绑定键盘按键按下的事件
      document.addEventListener('keydown', this.keydownHandler.bind(this))
      // 调用move方法，使蛇移动
      this.move()
   }
   // 创建一个键盘按下的响应函数
   keydownHandler(event: KeyboardEvent) {
      // 需要检查event.key的值是否合法

      // 修改direction属性
      this.direction = event.key
   }
   // 创建一个控制蛇移动的方法
   move() {
      /* 
         根据方向(this.direction)来使蛇的位置改变
         向上 top 减少
         向下 top 增加
         向左 left 减少
         向右 right 增加
      */
      // 获取蛇现在坐标
      let X = this.snake.X
      let Y = this.snake.Y
      // 根据按键修改X和Y值
      switch (this.direction) {
         case "ArrowUp":
            // 向上移动
            Y -= 10
            break
         case "ArrowDown":
            // 向下移动
            Y += 10
            break
         case "ArrowLeft":
            // 向左移动
            X -= 10
            break
         case "ArrowRight":
            // 向右移动
            X += 10
            break
      }

      // 检查蛇是否吃到了食物
      this.checkEat(X, Y)

      // 修改蛇的X值和Y值
      try {
         this.snake.X = X
         this.snake.Y = Y
      } catch (e: any) {
         // 进入catch说明出现了异常，游戏结束，弹出一个提示信息
         alert(e.message + 'GAME OVER!')
         // 将isLive改为false
         this.isLive = false
      }

      // 开启一个定时调用
      this.isLive && setTimeout(this.move.bind(this), 300 - (this.scorePanel.level - 1) * 30);
   }

   // 定义一个方法，检查蛇是否吃到了食物
   checkEat(X: number, Y: number) {
      if (X === this.food.X && Y === this.food.Y) {
         // 食物的位置要重置
         this.food.change()
         // 分数增加
         this.scorePanel.addScore()
         // 蛇的长度增加
         this.snake.addBody()
      }
   }
}

export default GameControl